<!DOCTYPE html>
<html>
<head>
    <title>任务管理</title>
    {% include 'system/common/header.html' %}
</head>
<body class="pear-container">
  <div class="layui-card">
    <div class="layui-card-body">
        <form class="layui-form" action="">
            <div class="layui-form-item">
                <label class="layui-form-label">搜索</label>
                <div class="layui-input-inline">
                    <input type="text" id="selectname" name="selectname" placeholder="" class="layui-input">
                </div>
                <button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="db-query">
                    <i class="layui-icon layui-icon-search"></i>
                    查询
                </button>
                <button type="reset" class="pear-btn pear-btn-md">
                    <i class="layui-icon layui-icon-refresh"></i>
                    重置
                </button>
            </div>
        </form>
    </div>
  </div>
<div class="layui-card">
    <div class="layui-card-body">
        <table id="task-table" lay-filter="task-table"></table>
    </div>
</div>
<style>
  .crontab-format {
      font-family: monospace;
      white-space: pre; /* 确保空格和换行被保留 */
      padding: 10px;
      background: #f4f4f4;
      border: 1px solid #ccc;
      border-radius: 5px;
  }
</style>
<div class="layui-card">
    <div class="layui-card-header"><h3>计划任务说明</h3></div>
    <div class="layui-card-body">
      <h4>添加自定义任务文件</h4>
      在根目录找到tasks文件目录，添加任务文件，文件名必须后缀为.py，如task1.py，文件内容如下：中需确保可独立运行，否则会报错。
<pre class="crontab-format">
  示例：
  def task1():
    print('这是一个计划任务task1')
  if __name__ == '__main__':
    task1() 
</pre>
    </div>
    <div class="layui-card-body">
        <h4>Crontab 表达式格式</h4>
<pre class="crontab-format">
  *  *  *  *  * 
  │ │ │ │ │
  │ │ │ │ └─── 周 (0 - 7) (周日 0 或 7)
  │ │ │ └───── 月 (1 - 12)
  │ │ └─────── 日 (1 - 31)
  │ └───────── 时 (0 - 23)
  └─────────── 分 (0 - 59)
</pre>
        <h4>各字段的合法值</h4>
        <ul>
            <li>分钟（0-59）: 表示每小时的第几分钟。</li>
            <li>小时（0-23）: 表示每天的第几小时。</li>
            <li>日（1-31）: 表示每月的第几天。</li>
            <li>月（1-12）: 表示月份。</li>
            <li>周（0-7）: 表示星期几，其中 0 和 7 都表示星期日。</li>
        </ul>
        <h4>特殊符号和用法</h4>
        <ul>
            <li><strong>星号（*）:</strong> 表示该字段可以是任何值。</li>
            <li><strong>逗号（,）:</strong> 用于指定多个值。例如，1,2,3 表示 1，2 和 3。</li>
            <li><strong>连字符（-）:</strong> 用于指定一个范围。例如，1-5 表示 1 到 5。</li>
            <li><strong>斜杠（/）:</strong> 用于表示步长。例如，*/5 表示每隔 5 个单位。</li>
        </ul>
        <h4>示例</h4>
        <ul>
            <li>每分钟执行一次: <code>cron = "* * * * *"</code></li>
            <li>每天中午 12 点执行: <code>cron = "0 12 * * *"</code></li>
            <li>每周一到周五的早上 9 点执行: <code>cron = "0 9 * * 1-5"</code></li>
            <li>每月的第一天执行: <code>cron = "0 0 1 * *"</code></li>
        </ul>
    </div>
</div>


</div>
<script type="text/html" id="task-toolbar">
    {% if authorize("system:task:add") %}
        <button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
            <i class="layui-icon layui-icon-add-1"></i>
            新增
        </button>
    {% endif %}
</script>
<script type="text/html" id="task-bar">
    <!-- {% if authorize("system:task:edit") %}
        <button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i
                class="layui-icon layui-icon-edit"> 编辑</i>
        </button>
    {% endif %} -->
    {% if authorize("system:task:remove") %}
        <button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i
                class="layui-icon layui-icon-delete"> 删除</i>
        </button>
    {% endif %}
</script>

<script type="text/html" id="task-status">
    <input type="checkbox" name="enable" value="{{ '{{d.id}}' }}" lay-skin="switch" lay-text="正在运行|已经暂停"
           lay-filter="task-enable" {{ "{{# if(d.next_run_time != null){ }} checked {{# } }}" }}>
</script>

<script type="text/html" id="task-createTime">
    {{ '  {{layui.util.toDateString(d.start_date,  "yyyy-MM-dd HH:mm:ss")}' | safe }}}
</script>
<script type="text/html" id="task-next_run_time">
  {{ '  {{layui.util.toDateString(d.next_run_time,  "yyyy-MM-dd HH:mm:ss")}' | safe }}}
</script>
</body>
{% include 'system/common/footer.html' %}
<script>
  layui.use(['table', 'form', 'jquery', 'popup', 'common'], function () {
    let table = layui.table
    let form = layui.form
    let $ = layui.jquery
    let popup = layui.popup
    let MODULE_PATH = "{{ url_for('system.adminTask.main') }}"
    let cols = [
      [
        { type: 'checkbox' },
        { title: 'ID', field: 'id', align: 'center', width: 100 },
        { title: '函数', field: 'func', align: 'center' },
        { title: '名称', field: 'name', align: 'center' },
        { title: '开始时间', field: 'start_date', align: 'center',templet: '#task-createTime'},
        { title: '是否运行', field: 'next_run_time', align: 'center', templet: '#task-status' },
        { title:'下一次运行时间', field: 'next_run_time', align: 'center', templet: '#task-next_run_time'},
        { title: '类型', field: 'trigger', align: 'center' },
        { title: '操作', toolbar: '#task-bar', align: 'center', width: 195 }
      ]
    ]
    
    table.render({
      elem: '#task-table',
      url: MODULE_PATH + 'query',
      page: true,
      cols: cols,
      skin: 'line',
      toolbar: '#task-toolbar',
      defaultToolbar: [{
        layEvent: 'refresh',
        icon: 'layui-icon-refresh',
      }, 'filter', 'print', 'exports']
    })

    // 表单提交事件
    form.on('submit(db-query)', function(data) {
      table.reload('task-table', {
          where: data.field, // 传递查询条件
          page: { curr: 1 } // 从第一页开始
      });
      return false; // 阻止表单默认提交
    });

    table.on('tool(task-table)', function (obj) {
      if (obj.event === 'remove') {
        window.remove(obj)
      } else if (obj.event === 'edit') {
        window.edit(obj)
      }
    })

    table.on('toolbar(task-table)', function (obj) {
      if (obj.event === 'add') {
        window.add()
      } else if (obj.event === 'refresh') {
        window.refresh()
      } else if (obj.event === 'batchRemove') {
        window.batchRemove(obj)
      }
    })

    form.on('submit(task-query)', function (data) {
      table.reload('task-table', { where: data.field })
      return false
    })
    //弹出窗设置 自己设置弹出百分比
    function screen () {
      if (typeof width !== 'number' || width === 0) {
        width = $(window).width() * 0.5
      }
      if (typeof height !== 'number' || height === 0) {
        height = $(window).height() - 100
      }
      return [width + 'px', height + 'px']
    }

    form.on('switch(task-enable)', function (obj) {
      let operate
      if (obj.elem.checked) {
        operate = 'enable'
      } else {
        operate = 'disable'
      }
      let loading = layer.load()
      $.ajax({
        url: MODULE_PATH + operate,
        data: JSON.stringify({ id: this.value }),
        dataType: 'json',
        contentType: 'application/json',
        type: 'put',
        success: function (result) {
          layer.close(loading)
          if (result.success) {
            layer.msg(result.msg, { icon: 1, time: 1000 })
          } else {
            layer.msg(result.msg, { icon: 2, time: 1000 })
          }
        }
      })
    })

    window.add = function () {
      layer.open({
        type: 2,
        title: '新增任务',
        shade: 0.1,
        area: ['500px', '500px'],
        content: MODULE_PATH + 'add'
      })
    }



    // window.edit = function (obj) {
    //   layer.open({
    //     type: 2,
    //     title: '修改任务',
    //     shade: 0.1,
    //     area: ['500px', '500px'],
    //     content: MODULE_PATH + 'edit/' + obj.data['id']
    //   })
    // }

    window.remove = function (obj) {
      layer.confirm('确定要移除该任务', { icon: 3, title: '提示' }, function (index) {
        layer.close(index)
        let loading = layer.load()
        // console.log(obj.data)
        $.ajax({
          url: MODULE_PATH + 'remove/' + obj.data['id'],
          dataType: 'json',
          type: 'delete',
          success: function (result) {
            layer.close(loading)
            if (result.success) {
              layer.msg(result.msg, { icon: 1, time: 1000 }, function () {
                obj.del()
              })
            } else {
              layer.msg(result.msg, { icon: 2, time: 1000 })
            }
          }
        })
      })
    }

    window.refresh = function () {
      table.reload('task-table')
    }
  })
</script>
</html>